Jeton Tutucuları Blok Sırasıyla Bul
Covalent Api sayesinde blok sıraları verilerek Jeton tutucuları bulunabilmektedir. Bu sayede tutucuların bakiyelerine de erişilir.
import requests
Tablo 151
Tablo 151 de benzer şekilde diğer fonksiyonlarda olduğu gibi ilk olarak "requests" kütüphanesi daha önce eklenmediyse eklenmelidir. Bu kütüphane ile oluşturulan URL'leri sorgulanmaktadır. Öncesinde kütüphane import metodu ile eklendiyse yeniden eklenmesine gerek yoktur. Birden fazla eklenmesi kodun derlenme süresini arttırır.
def JetonTutucularıBlokSırasıylaBul(ApiAnahtarı, Zincir\_Numarası,Adres,Fiat):
Tablo 152
Tablo 152'de görüldüğü üzere fonksiyon tanımlanırken "def" metodu kullanılmıştır. Fonksiyon çağırılma ismi olarak akılda kalıcılık göz önünde bulundurularak "JetonTutucularıBlokSırasıylaBul" ismi tercih edilmiştir ancak tercihe göre isim değişiklik gösterebilmektedir. Fonksiyon girdilerine sırasıyla bakılacak olunursa:
- ApiAnahtarı: Kayıt olunurken alınan kimlik anahtarıdır. Sorguları yaparken yapan kişiyi belirtmek için kullanılır.
- Zincir_Numarası: İçerisinden veri alınmak istenen blok zinciri ifade eder. Hangi zincirin hangi numaraya ait olduğu ileride belirtilecektir.
- Adres: Hesap geçmişi alınacak adresi belirtir. EtherScan gibi sitelerden elde edilebilir.
- Fiat: Fiyatların çevrileceği kur olmaktadır. Seçilen kurun fiyatına göre değerler belirlenir ve çıktı verir.
URL = "https://api.covalenthq.com" + "/v1/" + Zincir\_Numarası + "/tokens/" + Adres + "/token\_holders/" + "?quote-currency=" + Fiat + "&key=" + ApiAnahtarı
Tablo 153
Tablo 153'de fonksiyonun içerisine girildiğinde URL yapısının oluşturulması ile karşılaşılmaktadır. Yapı oluşturulurken sabit değerlerin yanında parametrelerin uygun sırayla yerleştirilmesi gerekmektedir. Bu sıradan farklı bir sıra tercih edilirse sorgu sağlanamayacak boş veri döndürülecektir. URL'ye parametrelerin eklenme sırasına bakılacak olunursa ilk olarak Zincir Numarası girilirken devamında Adres ve Fiat parametresi ile ilerlenmektedir. Son olarak da ApiAnahtarı eklenerek URL yapısı oluşturulmuş hal alır. Bu hali ile sorguya hazır bir duruma geçmiştir.
istek = requests.get(URL) hamverim = istek.json()
Tablo 154
Tablo 154'de görüldüğü üzere oluşturulan URL yapısının sorgulanması için "requests" kütüphanesinin get metodu gerekmektedir. Bu şekilde sorgulanan URL "istek" adında değişkene kaydedilir. Sonrasında anahtar kilit mantığı ile erişimi mümkün kılan JSON formatına çevrilmesi gerekmektedir. Bu da ".json()" fonksiyonu ile gerçekleştirilir ve sonrasında hamverim adındaki değişkene yerleştirilir.
verim = hamverim["data"]
Tablo 155
Veri kullanıma hazır olsa da halen ham haldedir. Bunun nedeni içerisinde kullanılacak verinin yanında yapılan sorgunun başarılı olup olmadığı ve varsa hataları yer almaktadır. Ancak bu veriler şu anlık kullanılmayacaktır. Bu nedenle "hamverim" içerisinden Tablo 155'de "data" anahtarına erişilerek kullanılması planlanan veri "verim" değişkenine kaydedilir. Artık anahtarlama işlemleri "verim" üzerinden gerçekleşecektir.
liste = []
Tablo 156
Tablo 156'da anahtarlara erişilerek kaydedilen verilerin eklenmesi için veri tabanına benzer bir yapı gerekmektedir. Bu yapı için liste türü tercih edilmiştir. Köşeli parantezler ile oluşturulan liste şu anlık boş şekilde kaydedilmektedir. İlerleyen satırlarda içerisine anahtarlar ile kaydedilen değişkenler eklenecektir.
SonGüncelleme = verim["updated\_at"] liste.append("Son Güncelleme: " + SonGüncelleme)
Tablo 157
Tablo 157'de görüldüğü üzere ilk olarak SonGüncelleme değişkeni kaydedilmektedir. Bu değişken içerisinde tüm jeton tutucuları için ortak olan Son Güncelleme tarihini barındırmaktadır. Uygun anahtar olan "updated_at" ile verim değişkeni içerisinden erişilir ve hemen alt satırında "append" fonksiyonu kullanılarak uygun başlık ile listeye eklenir.
items = verim["items"]
Tablo 158
Şu ana kadar erişilmiş olan SonGüncelleme değişkeni her Jeton Tutucu için ortaktır. Ancak items içerisinde liste olarak Tablo 158'de kaydedilen veriler asıl tutucuları birbirinden ayıran özellikleri içermektedir. Bu nedenle içerisinde for döngüsü ile dolaşılabilir.
index = 1
Tablo 159
Tutucuları birbirinden ayırmak ve ortak başlık kargaşasını önlemek için sıralama işlemlerini gerçekleştiren index değişkeni Tablo 159'da tanımlanmaktadır. Bu sayede for döngüsü içerisinde kaydedilen veriler birbirinden ayrılır.
for item in items:
Tablo 160
Tablo 160'da for döngüsüne giriş sağlanmaktadır. Bu gerçekleştirilirken "items" listesi içerisinden her bir elemana erişilip değişken olarak "item" adı verilir ve bu değişkende belirlenen işlemler gerçekleştirilir.
KontratOndalığı = ["İndex Numarası: "+ str(index),"Kontrat Basamağı: "+ str(item["contract\_decimals"])]
KontratAdı = ["İndex Numarası: "+ str(index),"Kontrat Adı: "+ str(item["contract\_name"])]
KontratSembolü = ["İndex Numarası: "+ str(index),"Kontrat Adı: "+ str(item["contract\_ticker\_symbol"])]
KontratAdresi = ["İndex Numarası: "+ str(index),"Kontrat Adresi: "+ str(item["contract\_address"])]
LogoURL = ["İndex Numarası: "+ str(index),"Logo URL: "+ str(item["logo\_url"])]
İşlemAdres = ["İndex Numarası: "+ str(index),"Adres: "+ str(item["address"])]
Bakiye = ["İndex Numarası: "+ str(index),"Bakiye: "+ str(item["balance"])]
ToplamArz = ["İndex Numarası: "+ str(index),"Toplam Arz: "+ str(item["total\_supply"])]
BlokUzunluğu = ["İndex Numarası: "+ str(index),"Blok Uzunluğu: "+ str(item["block\_height"])]
Tablo 161
Tablo 161'de for döngüsü içerisinde uygun anahtarlarla erişilen verilerin 2 elemanlı liste içerisinde eklendiği görünmektedir. İlk elaman sıralamayı ifade eden index numarasının string toplama işlemlerine sokulmak için "str()" fonksiyonu ile string haline getirildiği ve uygun başlığın verilerek sonlandırıldığı gözükmektedir. İkinci eleman ise değişkene uygun başlığın belirlenen anahtarla string toplama işlemi kullanılarak tamamlanmasıdır. Bu değişkenlere sırasıyla bakılması gerekirse:
- KontratOndalığı: Veri içerisinde bulunan birimlerin okunması ve anlamlandırılması sırasında kaç tane virgül ekleneceğini belirtmektedir. İtem içerisinden "contract_decimals" anahtarı ile erişilmektedir.
- KontratAdı: Akıllı kontratın adını belirtmektedir. İtem içerisinden "contract_name" anahtarı ile erişilmektedir.
- KontratSembolü: Akıllı kontratın sembolünü belirtmektedir. TRY – USD – ETH gibi gerçek hayatta kullanılan sembollere benzerlik göstermektedir. İtem içerisinden "contract_ticker_symbol" anahtarı ile erişilmektedir.
- KontratAdresi: Akıllı kontratın adresini belirtmektedir. Özellikle dikkat edilmelidir. Kontrat adı ve sembolünde kötü amaçlı kişiler tarafından benzetme çalışmaları yapılabilse de adres tektir ve sabittir. Bu nedenle dikkat edilmesi önem arz etmektedir. İtem içerisinden "contract_address" anahtarı ile erişilmektedir.
- LogoURL: Akıllı kontratın logosunun URL formatında çıktı vermesinden oluşmuştur. İtem içerisinden "logo_url" anahtarı ile erişilmektedir.
- İşlemAdres: İşlemlerin gerçekleştiği zincir adresini ifade etmektedir. İtem içerisinden "address" anahtarı ile erişilmektedir.
- Bakiye: Tutulan jetonların bakiyesini ifade etmektedir. Bu bakiyeler KontratOndalığı değişkeni ile okunmalıdır. İtem içerisinden "balance" anahtarı ile erişilmektedir.
- ToplamArz: Tutulan jetonun arz miktarını ifade etmektedir. Bu değerin doğru okunması ile fiyat tahminleri yapılabilir. Bu bakiyeler KontratOndalığı değişkeni ile okunmalıdır. İtem içerisinden "total_supply" anahtarı ile erişilmektedir.
- BlokUzunluğu: Jetonların tutulduğu blok zincir bloklarının sırasını belirtmektedir. İtem içerisinden "block_height" anahtarı ile erişilmektedir.
liste.append(KontratOndalığı ) liste.append(KontratAdı) liste.append(KontratSembolü) liste.append(KontratAdresi) liste.append(LogoURL) liste.append(İşlemAdres) liste.append(Bakiye) liste.append(ToplamArz) liste.append(BlokUzunluğu)
Tablo 162
Tablo 162'de istenilen anahtarlar ile veri değişkenlere kaydedildikten sonra her bir değişken "liste" içerisine ".append()" fonksiyonu ile eklenir. Bu veriler eklendikten sonra kullanıma hazır bir hal almaktadır. Liste içerisine kaydedilen ve anlamlandırılan veri görevlerde kullanıma hazırdır.
index += 1
Tablo 163
Tablo 163'de index değeri bir artırılarak döngüden çıkılır. Bir arttırılan döngü değişkeni sayesinde yeni veriler farklı sıra ile aynı liste içerisine kaydedilebilir hale gelmektedir.
DahaFazlaVeriVarMı = "Daha fazla Veri Var mı: " + str(verim["pagination"]["has\_more"])
SayfaNumarası = "Sayfa Numarası: " + str(verim["pagination"]["page\_number"])
SayfaBüyüklüğü = "Sayfa Büyüklüğü: "+ str(verim["pagination"]["page\_size"])
ToplamVeriSayısı = "Toplam Veri Sayısı: "+ str(verim["pagination"]["total\_count"])
liste.append(DahaFazlaVeriVarMı)
liste.append(SayfaNumarası)
liste.append(SayfaBüyüklüğü)
liste.append(ToplamVeriSayısı)
Tablo 164
Döngüden çıkıldıktan sonra Tablo 164'de yeni anahtarlar ile karşılaşılmaktadır. Bu anahtarlar verinin kaydedilen kısmından fazla olup olmadığını belirtmektedir. CovalentApi tek sayfada 100 döngü ile başlangıç değeri belirlemiştir. Bunun üstündeki değerler bu anahtarlarda bulunmaktadır. Verilere sırası ile bakılması gerekirse:
- DahaFazlaVeriVarMı: Çekilen veriden daha fazla bulunup bulunmadığını ifade etmektedir. Veri içerisindeki "pagination" anahtarına bağlı olan "has_more" anahtarı ile erişilmektedir.
- SayfaNumarası: Çekilen ve sayfalandırılan verinin hangi sayfasında işlem yapıldığını ifade etmektedir. Veri içerisindeki "pagination" anahtarına bağlı olan "page_number" anahtarı ile erişilmektedir.
- SayfaBüyüklüğü: Çekilen ve sayfalandırılan verinin sayfa başına sahip olduğu elementi ifade etmektedir. Başlangıç değeri CovelentApi tarafından 100 olarak belirlenmiştir. Veri içerisindeki "pagination" anahtarına bağlı olan "page_size" anahtarı ile erişilmektedir.
ToplamVeriSayısı: Çekilen verinin toplam kaç elemente sahip olduğunu ifade etmektedir. Sayfa büyüklüğü ile bölünerek toplam sayfa sayısı bulunabilmektedir. Veri içerisindeki "pagination" anahtarına bağlı olan "total_count" anahtarı ile erişilmektedir
for i in liste: print(i)
Tablo 165
Tablo 165'de veri kullanıma hazır olmaktadır. Bu veri kısa bir for döngüsü ile ekrana yazdırılır ve analize hazır hale gelir.
return liste
Tablo 166
Tablo 166'da görüldüğü üzere Fonksiyon sonunda "return" metodu ile liste fonksiyon çıktısı olarak döndürülmektedir. Bu çıktının uygun index'leme işlemleri ile istenilen parçasına ulaşılır.
def JetonTutucularıBlokSırasıylaBul(ApiAnahtarı, Zincir\_Numarası,Adres,Fiat): URL = "https://api.covalenthq.com" + "/v1/" + Zincir\_Numarası + "/tokens/" + Adres + "/token\_holders/" + "?quote-currency=" + Fiat + "&key=" + ApiAnahtarı istek = requests.get(URL) verim = (istek.json()) verim = verim["data"] liste = [] SonGüncelleme = verim["updated\_at"] liste.append("Son Güncelleme: " + SonGüncelleme) items = verim["items"] index = 1 for item in items: KontratOndalığı = ["İndex Numarası: "+ str(index),"Kontrat Basamağı: "+ str(item["contract\_decimals"])] KontratAdı = ["İndex Numarası: "+ str(index),"Kontrat Adı: "+ str(item["contract\_name"])] KontratSembolü = ["İndex Numarası: "+ str(index),"Kontrat Adı: "+ str(item["contract\_ticker\_symbol"])] KontratAdresi = ["İndex Numarası: "+ str(index),"Kontrat Adresi: "+ str(item["contract\_address"])] LogoURL = ["İndex Numarası: "+ str(index),"Logo URL: "+ str(item["logo\_url"])] İşlemAdres = ["İndex Numarası: "+ str(index),"Adres: "+ str(item["address"])] Bakiye = ["İndex Numarası: "+ str(index),"Bakiye: "+ str(item["balance"])] ToplamArz = ["İndex Numarası: "+ str(index),"Toplam Arz: "+ str(item["total\_supply"])] BlokUzunluğu = ["İndex Numarası: "+ str(index),"Blok Uzunluğu: "+ str(item["block\_height"])] liste.append(KontratOndalığı ) liste.append(KontratAdı) liste.append(KontratSembolü) liste.append(KontratAdresi) liste.append(LogoURL) liste.append(İşlemAdres) liste.append(Bakiye) liste.append(ToplamArz) liste.append(BlokUzunluğu) index += 1 DahaFazlaVeriVarMı = "Daha fazla Veri Var mı: "+str(verim["pagination"]["has\_more"]) SayfaNumarası = "Sayfa Numarası: " + str(verim["pagination"]["page\_number"]) SayfaBüyüklüğü = "Sayfa Büyüklüğü: "+ str(verim["pagination"]["page\_size"]) ToplamVeriSayısı = "Toplam Veri Sayısı: "+ str(verim["pagination"]["total\_count"]) liste.append(DahaFazlaVeriVarMı) liste.append(SayfaNumarası) liste.append(SayfaBüyüklüğü) liste.append(ToplamVeriSayısı) for i in liste: print(i) return liste
Tablo 167
Tablo 167'de fonksiyon bütünüyle verilmiştir. Fonksiyon özetlemek gerekirse, başlangıçta uygun parametreler ile oluşturulan URL yapısı eklenene kütüphane ile sorgulanır. Sorgu JSON formatına çevrilir ve anahtarlarla erişime hazır hale gelir. Sonrasında ortak anahtar olan "SonGüncelleme" değişkeni öncesinde oluşturulan listeye eklenir. Devamında "items" listesi içerisinde for döngüsü ile belirlenen başlıkta veriler listeye eklenir. Döngüden çıkıldıktan sonra sayfalandırma verisi de listeye eklenir ve liste tamamlanmış hale gelir. Çıktıyı görselleştirmek için for döngüsü ile tüm liste elemanları yazdırılır ve kod çıktısı olarak liste döndürülür.
19